package edu.pe.cayetano.util;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.beanutils.BasicDynaClass;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.DynaBean;
import org.apache.commons.beanutils.DynaClass;
import org.apache.commons.beanutils.DynaProperty;

import edu.pe.cayetano.framework.Configuration;
import edu.pe.cayetano.framework.DAOException;
import edu.pe.cayetano.seccd.constantes.ConstantesSECCD;

public class Utilitario {


	public static DynaBean createDynaBeanFromRequest(String dynaBeanName,
			HttpServletRequest req)throws Exception {
		HashMap 	map 	= new HashMap();
	    ArrayList 	list 	= new ArrayList();
	    Enumeration enumR 	= req.getParameterNames();
	    while (enumR.hasMoreElements()) {
	        String name = (String)enumR.nextElement();
	        String[] values = req.getParameterValues(name);
	        Class<?> type = null;
	        if (values.length == 1) {
	            type = String.class;
	        }
	        else {
	            type = String[].class;
	        }
	        DynaProperty prop = new DynaProperty(name, type);
	        list.add(prop);
	        map.put(name, values);
	    }
	    DynaProperty[] properties = (DynaProperty[])list.toArray(new DynaProperty[0]);
	    DynaClass dynaClass = new BasicDynaClass(dynaBeanName, null, properties);
	    DynaBean dynaBean = dynaClass.newInstance();
	    BeanUtils.populate(dynaBean, map);
	    return dynaBean;
	}
	
	public static DynaBean seteaDynaBeanListadoTabla(String optCampo,String criterio,String codigo){
		DynaBean dyna = null;
		try{
			DynaProperty[] properties ={
					new DynaProperty("operacion", String.class), 
					new DynaProperty("criterio", String.class), 
					new DynaProperty("optCampo", String.class),
					new DynaProperty("codigo", String.class),
			};
			DynaClass userDynaClass =  new BasicDynaClass("user", null, properties);
			dyna = userDynaClass.newInstance();
			dyna.set("operacion",ConstantesSECCD.OPERACION_LISTADO);
			dyna.set("criterio",criterio);
			dyna.set("optCampo",optCampo);
			dyna.set("codigo",codigo);
			
		}catch (Exception e) {
			System.out.println("Error generado por:"+e.getMessage());
		}
		return dyna;
	}
	
	public static String  getPropertyDynaBean(DynaBean dyna,String campo){
		String cadena = null;
		if(contieneParametroDynaBean(dyna,campo)){
			cadena		= (String)dyna.get(campo);
		}
		return cadena;
	}
	
	private static boolean contieneParametroDynaBean(DynaBean dyna,String parametro){
		DynaProperty[] props = dyna.getDynaClass().getDynaProperties();
		for (int i = 0; i < props.length; i++) {
			if(props[i].getName().equalsIgnoreCase(parametro)){
				return true;
			}
        } 
		return false;
	}
	
	


	
	
	public static int getPrimaryKey(String sequence,String table,Connection conn)throws Exception{
		String 				schema		= Configuration.getSchemaDB();
		PreparedStatement   pstmt 		= null;
		ResultSet			rs			= null;
		int codigo=0;

			try{
				StringBuffer query  = new StringBuffer();
				query.append(" select prevval for "+schema+sequence+" from "+schema+table);
				pstmt = conn.prepareCall(query.toString());
				rs=pstmt.executeQuery();
				if(rs.next()){
					codigo=rs.getInt(1);
				}
			}
			catch(Exception e){
				throw new DAOException(e.getMessage());
			}finally{
				try{
					if(pstmt!=null)pstmt.close();
					if(rs!=null)rs.close();
				}catch(Exception e1){}
			}
			return codigo;
	}
	

	
	public static boolean validaAtributoDynaBean(DynaBean dyna,String busqueda){
		boolean existe=false;
	      DynaProperty[] props = dyna.getDynaClass().getDynaProperties();
	        for (int i = 0; i < props.length; i++) {
	           String key = props[i].getName();
	           if(busqueda.equalsIgnoreCase(key)){
	        	   existe=true;
	        	   break;
	           }
	        }
	    return existe;
	}
	

	/**
	 * Metodo que genera el codigo de un registro con formato anualizado : anio+cantidad de ceros+cantidad registros
	 * */
	public static String generaCodigoInsercion(String anio,int codigo){
		int cantidadCeros=ConstantesSECCD.LONGUITUD_CODIGO_CERO_OS-String.valueOf(codigo).length();
		String temporal="";
		for(int i=0;i<cantidadCeros;i++){
			temporal="0"+temporal;
		}
		return anio+temporal+codigo;
	}

	/**
	 * Metodo que genera el codigo de un registro con formato anualizado : cantidad de ceros+cantidad registros
	 * */
	public static String generaCodigoInsercion(int codigo){
		int cantidadCeros=ConstantesSECCD.LONGUITUD_CODIGO_CERO_DETALLE_OS-String.valueOf(codigo).length();
		String temporal="";
		for(int i=0;i<cantidadCeros;i++){
			temporal="0"+temporal;
		}
		return temporal+codigo;
	}
	
	public static String generaCodigoInsercionArchivoHC(String hc,int codigo){
		
		String codigoArchivo="";
		if(codigo<10)
			codigoArchivo="-0"+codigo;
		else
			codigoArchivo="-"+codigo;
		
		return hc+codigoArchivo;
	}
	
	public static String obtieneFileHCxDyna(DynaBean dyna){
		System.out.println("filehc:<"+Utilitario.getPropertyDynaBean(dyna,"filehc")+">");
		String filehc = Utilitario.getPropertyDynaBean(dyna,"filehc");
		return filehc.substring(2,filehc.length());
	}
}
